package com.yy.web.pm.patrol.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
public class FileStorageService {

    private final Path fileStorageLocation;
    @Autowired
    private HttpServletRequest request;

// 定义一个名为FileStorageService的构造函数，接收一个名为uploadDir的字符串参数，并可能抛出异常
    public FileStorageService(@Value("${file.upload-dir}") String uploadDir) throws Exception {
    // 将传入的uploadDir字符串转换为Path对象，并将其转换为绝对路径，然后进行标准化处理
        this.fileStorageLocation = Paths.get(uploadDir).toAbsolutePath().normalize();
    // 使用Files类的createDirectories方法创建文件存储位置的目录，如果目录不存在的话
        Files.createDirectories(this.fileStorageLocation);
    }


    /**
     * 存储文件到指定功能模块目录
     * @param file 上传的文件
     * @param module 功能模块名（如 alarm/review）
     * @return 存储的相对路径（包含模块目录和文件名）
     */
    public String storeModuleFile(MultipartFile file, String module) throws Exception {
        // 创建模块子目录（如果不存在）
        Path moduleDir = this.fileStorageLocation.resolve(module);
        Files.createDirectories(moduleDir);

        // 生成带日期的文件名
        String fileName = generateDateBasedFileName(file.getOriginalFilename());

        // 存储文件
        Path targetLocation = moduleDir.resolve(fileName);
        try (InputStream inputStream = file.getInputStream()) {
            Files.copy(inputStream, targetLocation, StandardCopyOption.REPLACE_EXISTING);
        }

        return module + "/" + fileName; // 返回相对路径
    }
    private String generateDateBasedFileName(String originalFileName) {
        String fileExtension = getFileExtension(originalFileName);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String datePrefix = dateFormat.format(new Date());
        String shortRandomString = UUID.randomUUID().toString().substring(0, 4); // 取UUID的前4个字符
        return datePrefix + "_" + shortRandomString + (fileExtension.isEmpty() ? "" : "." + fileExtension);
    }

    /**
     * 生成唯一文件名：UUID + 原始文件扩展名
     */
    private String generateUniqueFileName(String originalFileName) {
        String fileExtension = getFileExtension(originalFileName);
        return UUID.randomUUID().toString() + (fileExtension.isEmpty() ? "" : "." + fileExtension);
    }

    /**
     * 获取文件扩展名
     */
    private String getFileExtension(String fileName) {
        if (fileName == null || fileName.lastIndexOf(".") == -1) {
            return "";
        }
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }
    public String storeAutoModuleFile(MultipartFile file) throws Exception {
        String module = extractModuleFromRequest();
        return storeModuleFile(file, module);
    }

    private String extractModuleFromRequest() {
        // 示例：从 "/patrol/upload" 提取 "patrol"
        String uri = request.getRequestURI();
        return uri.split("/")[1]; // 取第一个路径段
    }
}

